import json
import requests
import re
from time import sleep
from robot.api import logger
import hashlib
import os
#################################################################################################
#################################################################################################
def restful_api(url, method, args=None ,TK=None ,value_json=None):
    ''' *函数说明*: 执行Restful API请求

        *参数说明*:
           url:         HTTP请求的地址, 例如: http://test.com/api/equip_group/add
           method:      HTTP请求方式, 例如:  GET, POST, PUT, DELETE... 
           args:        HTTP请求参数, 以字典形式提供
           TK:          Cookie: TK=F4823B61-2F37-40F9-9212-3BA17F5DEE81-3169E157-5C80-407A-8E45-20A3741DC1FE
           value_json   args仅仅value需要json格式
        *example*:
            restful_api  ${add_group}  ${post}  @{data}  TK=${TK}

    '''
    ret = ''
    headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
               "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36",
               "Cookie": "TK={}".format(TK)}
    s = requests.session()
    for i in range(5):
        try:
            if method == 'post':
                if value_json:
                    for key in args:
                        v = args[key]
                        args[key] = json.dumps(v)
                    ret = s.post(url, data=args, headers = headers, timeout=120)
                else:
                    ret = s.post(url, data=args, headers = headers, timeout=120)
            elif method == 'get':
                ret = s.get(url, data=args, headers = headers, timeout=120)
            print (ret.status_code)
            return ret.content
        except Exception as e:
            logger.warn(e, True)
#################################################################################################
#################################################################################################
def get_login_TK_RandomStr(url,method='post'):
    ''' *函数说明*: 获取randomStr&TK

        *参数说明*:
           url:         HTTP请求的地址, :
           method:      HTTP请求方式, 例如:  GET, POST, PUT, DELETE... 

        *example*:
            ${login_TK}   ${RandomStr}  get_login_TK_RandomStr  ${get_random_TK}
        返回：
            ${login_TK}  ${RandomStr}
    '''
    ret = restful_api(url,method=method)
    ret = ret.decode('utf-8')
    ret = re.findall('"token":"(\\S+)","randomStr":"(\\S+)"',ret)[0]
    if ret:
        randomStr = ret[1]
        login_TK = ret[0]
        return login_TK,randomStr
    else:
        raise Exception("NO find randomStr and token the url is {}".format(url))


#################################################################################################
#################################################################################################
def get_passMd5(userpwd,randomStr):
    ''' *函数说明*: 登入密码使用加密模式
    '''
    pwd = '根据自己的需求'
    return pwd

#################################################################################################
#################################################################################################
def find_pattern_from_string(target_string, pattern, index=-1 , array_flag = "false", ignorecase = None):
    ''' *函数说明*: 不去除换行, 返回指定字符串中所有符合正则表达式的值

        *参数说明*:
            target_string: 目的字符串,  类型: str,  必选
            pattern: 正则表达式, 类型: str,  必选
            index:  指定匹配结果中的索引, 类型: str, 可选
            ignorecase:是否忽略大小写，类型: str（忽略大小写时，参数使用ignorecase）,默认匹配大小写 可选
            array_flag:是否按照数组模式取值，类型str(为true时，可以使用index=-1取最后一个匹配的数组元素)，可选
        *命令说明*: 见参数说明

        *example*:
             ${ret}    find_pattern_from_string    ${target_string}    ${pattern}    ${index}

        *返回值*: 返回匹配到的的字符串
		
    '''
    if isinstance(target_string, str):
        pass
    else:
        target_string = target_string.decode('utf-8')

    if ignorecase == 'ignorecase':
        get_string = re.findall(pattern, target_string,re.IGNORECASE)
    else:
        get_string = re.findall(pattern, target_string)
    
    strlen=len(get_string)

    if strlen == 0:
        return ""
    elif int(index) == -1 and array_flag != "true":
        return get_string
    else:
        return get_string[int(index)]
#################################################################################################
#################################################################################################    
def check_regexp_result(exp,msg,istrue = "True",ignorecase = None):
    ''' *函数说明*:检查预期结果和实际结果是否匹配   
    
        *参数说明*:
              exp: 预期结果, 类型:正则表达式, 必选
              msg: 希望匹配的字符串,类型: str, 必选
              istrue:设置是否匹配标志,类型: str, 可选
              ignorecase:是否忽略大小写，类型: str（忽略大小写时，参数使用ignorecase）,默认匹配大小写 可选
        *命令说明*: 见参数说明 
        
        *example*:
             check_regexp_result   he\\s*llo    "hello world"
             check_regexp_result   he\\s*llo    "hello world"    False
             check_regexp_result   he\\s*llo    "Hello world"    True  ignorecase

        *返回值*:  匹配失败则 Fail 

    '''     
    if isinstance(msg, str):
        pass
    else:
        msg = msg.decode('utf-8')

    if ignorecase == 'ignorecase':
        result = re.search(r'%s' % exp,msg,re.IGNORECASE)        
    else:
        result = re.search(r'%s' % exp,msg)
    if (result is not None) == (istrue.lower() == 'true'):
        return
    else:
        raise Exception('check result failed!')
#################################################################################################
#################################################################################################
def tpause(tempdir = 'trace_debug'):
    ''' *函数说明*: 在robotframework代码中设置断点, 该方法会预先创建一个空文件夹, 然后循环检查该文件夹是否存在,
                   如果指定文件夹存在, 则脚本继续暂停; 如果不存在(需要人工删除), 则脚本继续执行

        *参数说明*:
            tempdir:  指定需要创建的空文件夹名称, 可选
        *example*:
            tpause

        *返回值*:
            无
    '''

    if os.path.exists(tempdir):
        os.removedirs(tempdir)
    os.mkdir(tempdir)
    logger.info('... 脚本进入断点模式...', False, True)
    logger.info('... 临时文件夹存放路径: %s' % os.path.abspath(os.path.dirname(tempdir))+os.sep+tempdir, False, True)
    while True:
        if os.path.exists(tempdir):
            sleep(3)
        else:
            break

#################################################################################################
#################################################################################################
def json_Change(strL=None):
    ''' *函数说明*: 转json格式

        *参数说明*:
            strL:  传入字符
        *example*:
            json_Change  ${data2}

        *返回值*:
            json格式字符
    '''
    strL = json.dumps(strL)
    return strL
    
#################################################################################################
#################################################################################################
def ap_loginweb(loginurl,logouturl,username,password,array_flag = "True"):
    ''' *函数说明*: 登入AP web界面

        *参数说明*:
           loginurl:    登入AP web HTTP请求的地址, : http://192.168.200.100/cgi-bin/luci
           logouturl:   登出AP web HTTP请求的地址, : http://192.168.200.100/cgi-bin/luci/admin/logout
           array_flag:  判断AP web界面是否需要登入成功
        *example*:
            ap_loginweb   ${loginurl}  ${logouturl}   ${ip}   ${username}   ${password}
        返回：
            无
    '''
    ret = ''
    #防止有登入缓存，先进入登出操作
    restful_api(logouturl,'post')
    userpw= {'username': username,'password': password}

    ret = restful_api(loginurl,'post',userpw)
    if isinstance(ret, str):
        pass
    else:
        ret = ret.decode('utf-8')
    print(ret)
    array_flag.lower() == 'true'
    if array_flag.lower() == 'true' and '登出' in ret:
        return 
    elif array_flag.lower() == 'false' and '登出' not in ret:
        return
    else:
        raise Exception("login ap web fail")